package com.zw.a.basic.a11.demo04_exercise;

import java.util.*;

//Map集合案例: 通过字符串中每个字符的次数.
public class Demo05_代码实现_详细版 {
    public static void main(String[] args) {
        /*
            1.键盘录入一个字符串，要求统计字符串中每个字符出现的次数。
            2.举例：键盘录入“aababcabcdabcde” 在控制台输出：“a(5)b(4)c(3)d(2)e(1)”
         */
        //1. 创建Scanner对象.
        Scanner sc = new Scanner(System.in);
        //2. 提示用户录入一个字符串, 并接收.
        System.out.println("请录入一个字符串: ");
        String str = sc.nextLine();
        //3. 定义Map集合, 字符做键, 该字符对应的次数作为值.    即:  HashMap<Character, Integer>    a:3, b:1
        Map<Character, Integer> map = new HashMap<>();
        //Map<Character, Integer> map = new TreeMap<>();
        //4. 把字符串转成字符数组.
        char[] chs = str.toCharArray();
        //5. 遍历, 获取到每一个字符.
        for (char ch : chs) {
            //6. 判断该字符在双列集合中是否存在.
            if (!map.containsKey(ch)) {
                //6.1 不存在, 说明该字符是第一次出现, 就将其次数记录为1.
                map.put(ch, 1);
            } else {
                //6.2 存在, 说明该字符不是第一次出现, 就将其次数+1, 然后重新存储.
                int count = map.get(ch);
                map.put(ch, count + 1);
            }
        }
        //已知格式: a:3, b:1     目标格式: a(5)b(4)c(3)d(2)e(1)
        //7. 走到这里, Map集合记录的就是我们要的结果, 将其拼接成字符串.
        StringBuilder sb = new StringBuilder();
        Set<Character> keys = map.keySet();
        for (Character key : keys) {
            int count = map.get(key);
            sb.append(key).append("(").append(count).append(")");
        }
        //8. 打印结果.
        String result = sb.toString();
        System.out.println(result);
    }
}
